package com.glela.platform.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.glela.common.BaseSqlMapper;
import com.glela.platform.model.User;
import com.glela.platform.model.UserGuest;
import com.glela.platform.model.UserJournal;
import com.glela.platform.model.request.RequsetPersonalInfo;
import com.glela.platform.model.response.ResponseTeacher;
import com.glela.platform.model.response.ResponseUser;

/********************************************
 * 
 * <dl>
 * <dt>用户相关操作</dt>
 * </dl>
 * 
 * @author gwq
 * @date 2017年7月27日 13:44:05
 * 
 ********************************************/
public interface UserMapper extends BaseSqlMapper<User> {

//	public int deleteByPrimaryKey(Long id);

	/**
	 * 跟新账户的余额(覆盖)
	 * 
	 * @author gwq
	 * @return
	 */
	public int updateUserMoney(@Param("money")int money, @Param("id")long id);
	
	/***
	 * 查询更新时间在某个时间点以后的用户信息，用来做批量缓存
	 * @param updateTime
	 * @return
	 */
	public List<User> selectUserByUpdateTime(@Param("updateTime")String updateTime);
	
	/**
	 * 根据用户名获取用户信息
	 * 
	 * @param userName
	 * @return
	 */
	public User getUserByName(String userName);

	@Override
	public int insert(User record);

	@Override
	public int insertSelective(User record);

	/**
	 * 用户登录
	 * 
	 * @param user
	 * @return
	 */
	public ResponseUser login(User user);

	@Override
	public User selectByPrimaryKey(Long id);
	
	/**
	 * 直接培养的督导的数量
	 * 
	 * @param persionID
	 * @return
	 */
	public List<Integer> selectSupervisionBypersionID(@Param("PersionID") String persionID);

	public User selectRecommendFromByUserId(Long id);

	public User selectRecommendFromByPersionId(String persionId);
	
	public int batchUpdateMoney(List<UserJournal> list);

	/**
	 * <dl>
	 * <dt>更新普通角色的用户角色为会员</dt>
	 * </dl>
	 * 
	 * @param userList
	 *            item.id 用户id
	 * @return int
	 * @author zls
	 */
//	public int updateUpMemberInId(List<User> userList);

	public int updateOpenStoreInfoById(@Param("id") long id,
			@Param("recommendFrom") String recommendFrom,
			@Param("talentTeacher") String talentTeacher);
	/**
	 * <dl>
	 * <dt>更新用户为讲师</dt>
	 * </dl>
	 * 
	 * @param userList
	 * @return int
	 * @author gwq
	 */
	public int becomeTalentTeacherById(@Param("id") long id,
			@Param("recommendFrom") String recommendFrom,
			@Param("talentTeacher") String talentTeacher);

	/**
	 * 根据手机号查询用户Id
	 * 
	 * @param mobilePhone
	 * @return
	 */
	public Long selectIdByMobilePhone(String mobilePhone);

	public Long selectIdByUserName(String mobilePhone);

	/**
	 * 用户登录更新数据。。。
	 * 
	 * @param user
	 * @return
	 */
	public int updateByLogin(User user);

	public int subMoneyById(@Param("id") long id,
			@Param("cashCoin") long cashCoin);

	@Override
	public int updateByPrimaryKey(User record);

	@Override
	public int updateByPrimaryKeySelective(User record);

	/**
	 * <dl>
	 * <dt>批量更新用户会员身份id</dt>
	 * </dl>
	 * 
	 * @param list
	 *            item.id 用户id
	 * @param list
	 *            item.memberRecommend 会员推荐人用户id
	 * @return int
	 * @author zls
	 */
//	public int batchMemberRecommendById(List<User> list);

	/**
	 * 申请信用点币
	 * 
	 * @param userId
	 * @return
	 */
	public int updateCreditStatus(Long userId);

	/**
	 * 修改密码
	 * 
	 * @param user
	 * @return
	 */
	public int updatePasswordByMobilePhone(User user);

	/**
	 * 修改用户昵称，手机号
	 * 
	 * @param user
	 * @return
	 */
	public int updateUserInfoById(RequsetPersonalInfo requsetPersonalInfo);

	/**
	 * 查询用户及角色信息
	 * 
	 * @param userId
	 *            用户ID
	 */
	public ResponseUser selectUserRoleById(long userId);

	public ResponseUser selectUserRoleByPersonId(String personId);

	/**
	 * 获取系统开关值
	 * 
	 * @param key
	 *            开关类型
	 * @return
	 */
	public Integer selectSystemFlag(@Param("key") String key);

	/**
	 * 增加用户与设备的关系
	 * 
	 * @param userId
	 * @param guestId
	 * @return
	 */
	public int insertUserGuest(@Param("userId") long userId,
			@Param("guestId") long guestId);

	/**
	 * 查询匿名用户所绑定的注册用户数量（不包括当前用户时+1）
	 * 
	 * @param userId
	 * @param guestId
	 * @return
	 */
	public int selectGuestUserSize(@Param("userId") long userId,
			@Param("guestId") long guestId);

	public UserGuest selectUserGuestByGuestId(@Param("guestId") long guestId);

	/**
	 * 判断是否是新设备
	 * 
	 * @param deviceCode
	 * @return
	 */
	public int isNewDevice(String deviceCode);

	/**
	 * 判断是否是新用户
	 * 
	 * @param userId
	 * @return
	 */
	public int isNewUser(Long userId);

	/**
	 * @param mobile
	 * @param ip
	 * @param scene
	 * @param result
	 * @return
	 */
	public int insertIpQueryLog(@Param("mobile") String mobile,
			@Param("ip") String ip, @Param("scene") String scene,
			@Param("result") String result);

	/**
	 * 修改余额
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserInfonickMoneyById(@Param("id") long id,
			@Param("money") int money);

	/**
	 * 根据手机号码查询用户信息(带密码)
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public User selectUserByUserName(String userName);

	/**
	 * 根据手机号码查询用户信息(无密码)
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public User selectUserByUserNameNopassword(String userName);

	/**
	 * 根据手机号码查询用户信息(无密码)2
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public ResponseUser selectUserByUserNameNopassword2(String userName);

	/**
	 * 根据手机号码查询用户信息(带密码)
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public User selectUserEntityById(long id);

	/**
	 * 根据手机号码查询用户信息(无密码)
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public User selectUserEntityByIdNoPassword(long id);

	/**
	 * 用户注册
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int insertUser(@Param("userName") String userName,
			@Param("password") String password,
			@Param("recommendFrom") String recommendFrom,
			@Param("nickName") String nickName, @Param("picture") String picture);
	/**
	 * 新的用户注册方法  ningchongqing
	 */
	public int insertUserNew(@Param("userName") String userName,
			@Param("password") String password,
			@Param("recommendFrom") String recommendFrom,
			@Param("nickName") String nickName, @Param("picture") String picture, 
			@Param("bindRecommendMode") int bindRecommendMode,
			@Param("deviceCode") String deviceCode, @Param("nowDate") String nowDate);

	public int insertUserTalentTeacher(@Param("userName") String userName,
			@Param("password") String recommendFrom,
			@Param("recommendFrom") String talentTeacher,
			@Param("nickName") String nickName, @Param("picture") String picture);

	/**
	 * 用户修改密码根据id
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserPasswordById(@Param("id") long id,
			@Param("password") String password);

	/**
	 * 用户修改密码根据userName
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserPasswordByUserName(@Param("userName") String userName,
			@Param("password") String password);

	/**
	 * 用户退出登录
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserLastLoginTime(long id);

	/**
	 * 共用（修改经验值）
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserEmpiricValue(@Param("id") long id,
			@Param("empiricValue") int empiricValue);

	public int updateUserTotalSale(@Param("totalSale") int totalSale,
			@Param("id") long id);

	/**
	 * 根据推荐人身份id查询用户信息
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public List<User> selectUserByRecommendFrom(
			@Param("recommendFrom") String recommendFrom,
			@Param("page") int page, @Param("pageSize") int pageSize);

	/**
	 * 根据推荐人身份id查询推荐用户数量
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int selectUserByRecommendFromCount(String recommendFrom);

	/**
	 * 根据用户id修改用户昵称
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserNickName(@Param("nickName") String nickName,
			@Param("id") long id);

	/**
	 * 根据用户id修改用户头像
	 * 
	 * @param userId
	 * @param money
	 * @return
	 */
	public int updateUserPicture(@Param("picture") String picture,
			@Param("id") long id);

	/**
	 * 美妆咨询
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public List<User> selectUserByRoleId7NoPassword(
			@Param("pageLimit") int pageLimit, @Param("pageSize") int pageSize);

	/**
	 * 美妆咨询
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public int countUserByRoleId7();

	/**
	 * 达人主页邀请修改大人主页的背景图和达人简介
	 * 
	 * @author 卫耀华
	 * @param talentId
	 * @param talentDescription
	 * @param talentBackgroundImage
	 * @return
	 */
	public int updateUserSynopsisAndBackgroundImageById(
			@Param("talentId") Long talentId,
			@Param("talentDescription") String talentDescription,
			@Param("talentBackgroundImage") String talentBackgroundImage);

	// 第三方登录暂用
	public User selectUserInfoByIdDesc();

	/**
	 * 修改手机号码
	 * 
	 * @author chengzhequan
	 * @return
	 */
//	public int updateAccountNoByUserId(@Param("userName") String userName,
//			@Param("password") String password, @Param("id") long id);

	/**
	 * 修改角色信息
	 * 
	 * @author chengzhequan
	 * @return
	 */
//	public int updateRoleIdById(@Param("roleId") int roleId,
//			@Param("id") long id);

	/**
	 * 删除用户
	 * 
	 * @author chengzhequan
	 * @return
	 */
//	public int deleteUserById(long id);

	public int updateUserFansCount(@Param("fansCount") int fansCount,
			@Param("id") long id);

	public List<User> selectUserWhereUserNameIsNull();

	public int selectOrderDetailByUserIdSumTotalFee(long userId);

/*	public int updateUserRoseIdByUserId(@Param("id") long id,
			@Param("talentEffectTime") String talentEffectTime,
			@Param("talentFailureTime") String talentFailureTime);*/

	public int updateRecommendFromById(
			@Param("recommendFrom") String recommendFrom, @Param("id") long id);
	
	public int updateRecommendFromByIdNew(
			@Param("recommendFrom") String recommendFrom, @Param("bindRecommendMode") int bindRecommendMode, 
			@Param("deviceCode") String deviceCode, @Param("nowDate") String nowDate, @Param("id") long id);

	public int updateisOpenRecommandById(
			@Param("isOpenRecommand") int isOpenRecommand, @Param("id") long id);

	public int selectUserMoney(long userId);

	/**
	 * 
	 * 方法用途：用于判断该用户是否购买过B区自营商品，且存在过【单笔订单】金额满360元且支付成功的记录，存在就返回1，不存在就返回0
	 * 
	 * @author 卫耀华
	 * @date 2017-02-20
	 * @param userId
	 * @return
	 */
	public Integer countSingleOrderInfo(@Param("userId") long userId);

	public List<Integer> selectUserInsert();

	public List<ResponseTeacher> selectTeacherByPhone(String searchText);

	public List<ResponseTeacher> selectTeacherByLikeNickName(
			@Param("searchText") String searchText,
			@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);

	public List<Long> selectCanUpVipIds();

//	public int updateUsersToVip(@Param("userIdList") List<Long> userIdList);

	public User selectUserBaseInfoById(long userId);

	public User selectUserBaseInfoByPersionId(String persionId);

	/**
	 * **********************************************
	 * 
	 * @Title: updateUserShareCount
	 * @Description: 更新店铺分享次数
	 * @param @param storeUserId
	 * @param @param i 设定文件
	 * @return void 返回类型
	 * @throws 异常
	 * @author NingChongQing 作者
	 * @date 2017年7月20日 下午4:19:25 时间
	 *       **********************************************
	 */
	public int updateUserShareCountById(@Param("id") Long id,
			@Param("storeShareCount") Integer storeShareCount);
	/**
	 * 用户激活VIP
	 * @param userId
	 * @return
	 */
	public int updateVipUserByUserId(@Param("userId")Long userId, @Param("roleId")int roleId, @Param("startDate") String startDate, @Param("endDate")String endDate);

	public List<User> selectAllByPage(@Param("i")int i,@Param("j") int j);

	public Integer selectOldRoleByPrimaryKey(@Param("userId") Long userId);

	/**
	 * <dl>
	 * <dt>枚举各角色用户id</dt>
	 * </dl>
	 * @return List<Long>
	 * @author zls
	 * @date 2018年1月3日 下午7:52:27
	 */
	public List<Long> selectUserRoleEnum(@Param("roleIds") long[] roleIds);

	public List<User> selectUserListByRecommendFrom(String recommendFrom);
}
